%-----------------------------------------------------------------------------------
%--Nombre:      PCAEstadistico                                                    --
%--Descripcion: Algoritmo para implementar PCA Estadistico                        --
%--Parametros:  - datos: fichero con los datos o caracteristicas de cada clase    --
%--             - clases: fichero con los nombres de las clases                   --
%--             - nombreFichero: nombre fichero de imagen y matriz de pesos       --
%--             - etiquetas: activar/desactivar mostrar etiquetas		  --
%--Autores:     Daniel Cantón González                                            --
%--             Juan Pedro Gómez Bocos                                            --
%--Versión:     1.0                                                               --
%------------------------------------------------------------------------------------

function PCAEstadistico(datos,clases,nombreFichero,etiquetas)

    %Comprobacion del numero de argumentos
    if nargin~=4
      error('La llamada a la funcion debe ser: PCAEstadistico(ficherodatos,ficheroclases,nombreFichero,etiquetas)');  
    end

    % Lectura del fichero que contiene los datos
    data = dlmread(datos,';');
   
    % Numero de filas(muestras) y columnas(variables) que se tienen en el conjunto de datos
    [fil,col]=size(data);
    
    % Centramos los datos restando la media
    media = mean(data);
    for i=1:fil
      data(i,:)=data(i,:)-media;     
    end

    % s valores propios
    % u vectores propios
    % svd: singular values decomposition

    [u,s,v]=svd(cov(data));
    
    % Obtengo las dos primeras componentes principales
    w = u(:,1:2)';  

    % Lectura del fichero de nombres (clases)
    nombres = textread(clases,'%s','delimiter','\n');

    clases = unique(nombres);
    [numclases]=size(clases);    
       
    % Obtengo los colores de las figuras
    colores = jet(numclases(1,1));

    % Represento los datos       
    f=figure;
    hold on;
    
    %Título de la figura
    title('PCA Estadistico');
    %Nombre de la figura
    set(f,'Name','PCA Estadistico');
    set(f,'NumberTitle','off');
  
    % Dibujamos las figuras
    for i=1:fil
      x = data(i,:);
      y = w*x';

      for j=1:numclases
         % Compruebo la clase de la observacion e imprimo con el color de
         % la clase
         comp=strcmp(nombres(i,1), clases(j,1));
         if (comp)                     
            plot(y(1),y(2),'.','color', colores(j,:));
	    if(etiquetas)
		text(y(1),y(2),nombres(i,1));
	    end
            break;
         end
      end
      
      hold on
    end

    xlabel('Primera Componente Principal');
    ylabel('Segunda Componente Principal');
    
    %Guardar la imagen en un fichero
    saveas(f,strcat(nombreFichero,'PCAEstadistico'),'jpg');
    
    %Guardar la matriz de pesos en un fichero
    fnombre=strcat(nombreFichero,'PCAEstadisticoPesos.txt');
    fid = fopen(fnombre,'w');
    for i=1:2
        for j=1:col
            fprintf(fid,'%6.4f \t',w(i,j));
        end
        fprintf(fid ,'\n');
    end
    fclose(fid);
    